Программы
Книги
Статьи

27_img

Баранов В.Н.Применение микроконтроллеров AVR.Схемы,алгоритмы,программы.2004

Какой микроконтроллер выбрать? Где найти его описание? Где взять профамму, обеспечивающую написание, отладку и редактирование программ для микроконтроллера? 1де взять программатор и профамное обеспечение для него? Как приступить к работе, когда все это уже есть? Как все сделать с минимальными затратами средств и времени?


Скачать книгу  

Описание

Оглавление
Предисловие 6
Глава 1. Что нужно для работы с микроконтроллером 8
1.1. Где найти и как загрузить минимальный набор программного
обеспечения и документации для микроконтроллеров AVR 8
1.2. О программаторах 9
1.3. Источник питания 10
1.4. Дополнительные сведения И
Глава 2. Первый проект: контроллер сигнализации 12
2.1. Постановка задачи 12
2.1.1. Устройства, подключаемые к контроллеру,
и параметры входных и выходных сигналов 12
2.1.2. Логика работы контроллера 13
2.1.3. Схема сигнализации 14
2.1.4. Словесное описание алгоритма работы контроллера 16
2.2. Начинаем работу с AVR Studio 17
2.2.1. Создание первой программы на Ассемблере 17
2.2.2. Программа для контроллера сигнализации с использованием
прерываний 48
2.3. Советы ; 66
Глава 3. Работа с внешним статическим ОЗУ 68
3.1. Интерфейс микроконтроллера ATmega8515 для подключения внешней
памяти 68
3.2. Пример подключения внешнего ОЗУ к микроконтроллеру ATmega8515
70

3.2.1. Схема 70
3.2.2. Установка адреса 72
3.2.3. О выборе микросхемы регистра 72
3.2.4. Считывание данных из внешней памяти 73
3.2.5. Запись данных во внешнюю память 73
3-


Оглавление
3.3. Программный доступ к оперативной памяти 73
3.3.1. Простая программа обращения к оперативной памяти 73
3.3.2. Отладка программы 75
3.3.3. Сохранение содержимого ОЗУ на диске 77
3.3.4. Запись данных в начальную область внешней памяти 77
3.4. Обращение к буферам как к ячейкам памяти микроконтроллера
ATmega8515 79
3.4.1. Электрическая схема подключения буферов 79
3.4.2. Программа обслуживания буферов 82
3.4.3. Отладка программы обслуживания буферов 84

3.5. Подключение внешней памяти 512 Кбайт к микроконтроллеру
ATmega8535 87
3.6. Схема подключения ОЗУ к микроконтроллеру ATmega8535 87

3.6.1. Описание схемы 89
3.6.2. Запись в ячейку 90
3.6.3. Считывание из ячейки 90
3.7. Программа записи данных в ОЗУ 512 Кбайт 91
3.7.1. Отладка программы 95
3.7.2. Подпрограмма установки адреса SetAddr: 97
3.7.3. Подпрограмма копирования байта из внутреннего ОЗУ DataSt... 98
3.7.4. Подпрограмма копирования данных из внешней памяти
во внутреннее ОЗУ DataLd 99
Глава 4. Устройство динамической индикации на 7-сегментных индикаторах.. 100
4.1. Принцип динамической индикации 100
4.2. Восьмиразрядное устройство отображения цифровой информации... 102

4.2.1. Схема управления восьмиразрядным индикатором 102
4.2.2. Программа организации бегущей строки 105
4.2.3. Описание программы 108
4.3. Устройство управления двумя печами 114
4.3.1. Работа устройства 114
4.3.2. Программа управления двумя печами 116
4.3.3. Работа с устройством управления двумя печами 152
4.3.4. Особенности работы EEPROM микроконтроллера 154
Глава 5. Связь микроконтроллера с компьютером 157
5.1. Схема контроллера, обеспечивающая связь
с СОМ-портом компьютера 157
5.2. Программное обеспечение связи по каналу RS-232 160
5.2.1. Протокол обмена 161
5.2.2. Общие положения 161
5.2.3. Структура сообщения 162


Оглавление
5.2.4. Передаваемые сообщения
(команды компьютера и ответы контроллера) 162
5.2.5. Программа для микроконтроллера 163
5.2.6. Отладка работы UART в AVR Studio 185
5.3. Канал RS-232: программное обеспечение
для компьютера 187
5.3.1. Минимальные сведения о Delphi 188
5.3.2. Программа обмена данными с микроконтроллером 189
5.3.3. Описание работы программы 197
5.3.4. Сохранение, запуск, использование программы 201

5.4. Программа-монитор связи через СОМ-порты 201
5.5. Использование функций Windows API
для обращения к СОМ-порту 206
Глава 6. Организация аналоговых выходов для микроконтроллера 209
6.1. Преобразование кода в ширину импульса 210
6.1.1. ЦАП и генератор пилообразного напряжения с PWM 210
6.1.2. Таймер Т1 микроконтроллера в режиме PWM 210
6.1.3. Программа для генератора PWM 211
6.2. Преобразование кода в амплитуду импульса 214
6.2.1. Генератор пилообразного напряжения 214
6.2.2. Программа для генератора пилообразного напряжения 217
6.2.3. Генератор синусоидального сигнала 221
6.2.4. Программа для генератора синусоидального сигнала 223
6.3. Определение пространственного модуля сигнала 228
6.3.1. Алгоритм программы 228
6.3.2. Листинг программы вычисления модуля 229
6.4. Цифровой фильтр 243
6.4.1. Листинг С-программы цифрового фильтра 245
Приложение 1. Как получить необходимые материалы через сеть Internet 253
Приложение 2. Устройства, облегчающие отладку контроллера
в составе системы 255
Приложение 3. Программатор 261
Приложение 4. 8-разрядные RISC-микроконтроллеры фирмы Atmel 284
-5


УДК 621.316.544.1(035.5)
ББК 32.844.1-04я2 Б24
Баранов В.Н.
Б24 Применение микроконтроллеров AVR: схемы, алгоритмы,
программы. — М.: Издательский дом «Додэка-ХХ1», 2004. —
288 с: ил. (серия «Мировая электроника»)
ISBN 5-94120-075-7
Какой микроконтроллер выбрать? Где найти его описание? Где взять про-
фамму, обеспечивающую написание, отладку и редактирование программ для
микроконтроллера? 1де взять программатор и профамное обеспечение для него? Как
приступить к работе, когда все это уже есть? Как все сделать с минимальными
затратами средств и времени?
Автор делится опытом работы с 8-разрядными микроконтроллерами AVR
корпорации Atmel. Книга знакомит с действиями, необходимыми для начала
применения микроконтроллеров. Показаны все этапы разработки устройств на
микроконтроллерах. Особое внимание уделено связи предлагаемых схемных ре-
шений с программным обеспечением разрабатываемых устройств. В каждой главе
предлагаются электрические схемы устройств - контроллеров на базе микро-
контроллеров AVR, а также несколько профамм, определяющих функционирование
этих контроллеров. Все устройства с приведенными профаммами вполне
работоспособны и могут быть повторены. Функциональные узлы микроконтроллеров
описаны в объеме, достаточном для понимания профамм. Приведенные в книге
программы отлаживались в среде AVR Studio версии 4.08, работе с которой
посвящена отдельная глава книги.
Материал основан на рассмотрении реально работающих устройств и излагается
по принципу "от простого к сложному". Поэтому книга представляет интерес как для
начинающих "электронщиков", так и для специалистов.
УДК 621.316.544.1 (035.5)
ББК 32.844.1-04я2
Ответственный редактор Р. Г. Апексанян
Научный редактор Н. В. Каратаев
Художественный редактор М. С. Коршунова
Технический редактор В.И. Матвеева
Графики А. Ю. Анненков, А. Н. Клочков
Верстальщик Н. М. Хлебосолова
Издательский дом «Додэка-ХХ1» ИД № 02041 от 13.06.2000 г ОКП 95 3000
105318 Москва, а/я 70 Тел./факс: (095) 366-24-29, 366-81-45
E-mail: books@dodeca.ru; icmarket@dodeca.ru
Подписано в печать 00.00.2004. Формат 60x90/16. Бумага типофаф. № 2.
Гарнитура «NewtonC». Печать офсетная. Объем 18.0 п. л. Усл. печ. л. -18.0.
Тираж 5000 экз. Изд. № 42. Заказ № 2211.
Отпечатано с готовых диапозитивов в ОАО «Типофафия Новости».
105005 Москва, ул. Ф. Энгельса, 46
ISBN 5-94120-075-7 © Баранов В. Н., 2004
© Издательский Дом «Додэка-ХХ1», 2004 ®
Серия «Мировая электроника»


предисловие
Уважаемые читатели!
Книга, предлагаемая вашему вниманию, написана на основе опыта ра-
боты с 8-разрядными микроконтроллерами AVR серии ATmega корпора-
ции Atmel, а также с учетом вопросов, поступающих на сайт
http://bvnl23.boom.m/.


С^


Контрол
лер —
законче
нное
электро
нное
устройст
во,
обычно
вы-
полненн
ое в
виде
платы
(плата
контрол
лера) и
предназ
наченно
е для
приема
и
обработ
ки
сигналов
от
датчико
в, а
также
для
управле-
ния
внешни
ми
устройст
вами на
основан
ии
результа
тов
обработ
ки
принят
ых
сигнало
в.
Микрок
онтролл
ер —
програм
мно
управля
емая
интеграл
ьная
микро-
схема,
применя
емая для
построе
ния
различн
ых
контрол
леров.


Трудности, возникающие у разработчика при проектировании пятого
или десятого контроллера, меркнут на фоне проблем, с которыми сталки-
вается новичок. Обычно возникают следующие вопросы:
• какой микроконтроллер выбрать;
• где найти его описание;
• где взять программу, обеспечивающую написание, отладку и редак-
тирование программ для микроконтроллера;
• где взять программатор и программное обеспечение для него;
• как приступить к работе, когда все это уже есть;
• как все это сделать с минимальными затратами средств и времени.
Вопросам получения через сеть Internet минимального набора про-
грамм и документации, достаточного для работы с микроконтроллерами
AVR, посвящена первая глава книги.
Так как поиск информации представляет определенные трудности для
тех, кто имеет небольшой опыт работы в сети Internet, в Приложении 1 да-
ны рекомендации по поиску необходимой информации.
Основная цель второй главы — обучение навыкам эффективной рабо-
ты в среде разработки и отладки программ AVR Studio 4.08 для микрокон-
-6


Предисловие
троллеров. В этой главе возможности AVR Studio рассматриваются очень
подробно, так, чтобы разобраться в них смог читатель, не обладающий
достаточным опытом работы на компьютере. Освоение AVR Studio прохо-
дит на конкретном примере полного цикла разработки устройства сигна-
лизации — от описания требований к устройству до отладки программы.
Здесь же даны рекомендации по обнаружению и исправлению ощибок в
программе.
Примерно одинаково построение остальных глав книги. В каждой из
них предлагаются электрические схемы контроллеров на базе микрокон-
троллеров AVR, а также несколько различных программ, определяющих
функционирование контроллеров. Функциональные узлы микроконтрол-
леров описаны в объеме, достаточном для понимания программ, полное
их описание можно найти в техническом описании микроконтроллеров.
В Приложении 2 вы найдете описание устройств, облегчающих тести-
рование контроллеров, а также цифровых схем.
В Приложении 3 приведены сведения, которые помогут вам при разра-
ботке собственного программатора.
Все описываемые в книге программы для микроконтроллеров отлажи-
вались в AVR Studio версии 4.08. Программное обеспечение для компьюте-
ра написано в Delphi.
Описываемые устройства являются фрагментами больщих разработок.
Эти фрагменты адаптированы специально для книги так, чтобы наиболее
лаконично проиллюстрировать работу изучаемой функции микрокон-
троллера либо предлагаемого аппаратного или программного рещения.
При этом все устройства с приведенными программами вполне работоспо-
собны и могут быть повторены.
Наиболее продуктивным представляется просмотр книги с одновре-
менной отработкой изучаемого материала на компьютере. Особенно это
касается второй главы — ознакомление с нею без работы с компьютером
вряд ли принесет пользу. В связи с этим перед изучением какой-либо про-
граммы, приводимой в книге, лучще предварительно набрать ее в AVR Stu-
dio и иметь ее перед глазами на мониторе. Кроме того, материал каждой
последующей главы дается в расчете на то, что читатель ознакомился с
предьщущими главами, поэтому описание уже разбиравшихся ранее фраг-
ментов программ или схем опускается.
Ваши замечания и пожелания направляйте по адресу bvnl23@bk.ni
Надеюсь, что книга окажется вам полезной.
Автор.


Глава 1. Что нужно ддя работы
с микроконтроллером
Для работы с 8-разрядными микроконтроллерами AVR корпорации
Atmel (далее — микроконтроллер) вам понадобится программное обеспе-
чение для разработки и отладки проектов, документация на микрокон-
троллеры, программатор и источник питания.
Вероятно, компакт-диск, содержащий программное обеспечение, и
документацию на различные программаторы можно приобрести в любом
крупном городе.
Однако все необходимое, включая схему программатора, а также компью-
терную программу для его обслуживания, можно загрузить из сети Internet.
В целях экономии вашего времени в следующем разделе приводятся ссыл-
ки непосредственно на материалы, которые вам понадобятся. Ссылки были
проверены в марте 2004 года, еслиже они перестали работать, вам придется ра-
зыскать их самостоятельно. Возможно, вам будут полезны рекомендации по
поиску и загрузке материалов из сети, приведенные в Приложении 1.
1.1. Где найти и как загрузить минимальный набор
программного обеспечения и документации для
микроконтроллеров AVR
Для работы вам необходимо загрузить с сайта корпорации Atmel сле-
дующие материалы".
• последнюю версию интегрированной среды разработки программ-
ного обеспечения для микроконтроллеров AVR:
http://www.atmel.com/dyn/resources/prod_documents/astudio4.exe;
• файлы документации на микроконтроллеры:
http://www.atmel.com/dyn/products/datasheets.aspyamily_id = 607;
• файлы *.inc наименований регистров и констант микрокошрол леров:
http://www.atmel.com/dyn/resources/prod_documents/avrOOO.zip.
Вы можете разыскать эти материалы (в тч. файл avrOOO.exe) самостоя-
тельно на сайте корпорации Atmel {http://www.atmel.ru/).


1.2. О программаторах
1.2. О программаторах
Ссылки на программаторы не приводятся. Попробуйте разыскать их
самостоятельно. Воспользуйтесь для этого поисковыми сайтами, обеспе-
чивающими поиск в сети по ключевым словам. В качестве ключевой мож-
но использовать фразу «программатор микроконтроллера avr». Более под-
робно о поиске читайте в Приложении 1.
Предлагаемые для микроконтроллеров AVR программаторы можно
классифицировать по способу загрузки программ в память микроконтрол-
леров и по способу подключения к компьютеру.
Программаторы с параллельной (побайтной) загрузкой программ
практически не предлагаются. Их преимущества — более высокая ско-
рость программирования и некоторые дополнительные возможности (в
частности, они позволяют установить в микроконтроллере защиту от ра-
боты с последовательным программатором). К недостаткам можно отне-
сти необходимость извлечения микроконтроллера из системы для пере-
программирования (то есть из платы контроллера, в составе которой рабо-
тает микроконтроллер). Вероятно, основное назначение таких
программаторов — массовое программирование микроконтроллеров пе-
ред их установкой в систему. Однако, используя программатор с последо-
вательной загрузкой, например, совместно с микроконтроллером АТ-
MegaS, можно перепрограммировать его линию RESET (системный сброс
микроконтроллера) так, что в дальнейшем она будет функционировать как
обычная линия ввода/вывода. После этого работа программатора с после-
довательной загрузкой становится невозможной. Объясняется это тем, что
для его работы требуется функционирование упомянутой линии именно в
режиме RESET. Восстановить же работу линии в режиме RESET можно
только с помощью параллельного программатора.
Для разработчика более удобен программатор с последовательной (по-
битной) загрузкой программ в микроконтроллер. При соблюдении неко-
торых мер на этапе проектирования схемы контроллера, о которых будет
упомянуто позже, с помощью последовательного программатора микро-
контроллер можно запрограммировать, не извлекая его из системы.
Программаторы подключаются либо к LPT-порту, либо к СОМ-порту
компьютера. Последний дороже и неудобен, так как содержит значитель-
но больше элементов, в том числе и недорогой микроконтроллер, который
должен быть запрограммирован каким-то другим программатором. Зато
кабель для его подключения к компьютеру может быть длинным.
Для этого можно воспользоваться простейшим программатором, пред-
ставляющим собой несколько проводников, подключаемых с одной сто-
роны к LPT-порту, а с другой — к программируемому микроконтроллеру
-9


Гпава 1. Что нужно для работы с микроконтроллером
Но такой программатор работает неустойчиво, а проводники должны быть
как можно короче.
Вполне приемлемы программаторы, подключаемые к LPT-порту разъ-
емом DB25. В корпусе такого разъема размещается печатная плата про-
грамматора. При длине кабеля до 1 м сбои в работе программатора не об-
наруживаются. Основой программатора является микросхема КР1533АП5
или ее аналог
Очень удобно, если после программирования микроконтроллера ком-
пьютерная программа, обслуживающая программатор, переводит все его
выходные линии, связанные с микроконтроллером, в высокоимпедансное
состояние — в этом случае нет необходимости каждый раз после програм-
мирования микроконтроллера отключать программатор.
Несомненным достоинством программатора, подключаемого к LPT-
порту компьютера, является возможность отлаживать связь микро-
контроллера с компьютером через СОМ-порт без отключения программа-
тора и микроконтроллера от компьютера. Если мышка подключается к
компьютеру через один из СОМ-портов, то в распоряжении разработчика
обычно остается лишь один свободный СОМ-порт. При использовании
программатора, подключаемого к СОМ-порту компьютера, вы будете вы-
нуждены постоянно подсоединять то программатор, то микроконтроллер
к СОМ-порту разъем которого к тому же находится на задней панели ком-
пьютера.
При выборе программатора стоит также учесть его способность про-
граммировать как серию АТ90, так и серию ATMega. Поэтому желательно,
чтобы программное обеспечение программатора поддерживало протокол
программирования обеих серий. Кроме того, необходимо убедиться, что
программное обеспечение поддерживает программирование битов защи-
ты памяти программ от считывания (Lock bits) именно с вашим програм-
матором.
1.3. Источник питания
Обычно микроконтроллер и программатор питаются от одного источ-
ника напряжения (+5 В). Источник должен быть гальванически развязан
от сети переменного тока 220 В 50 Гц, так как общий провод источника со-
единяется через программатор с компьютером.
Желательно использовать источник с регулируемым током срабатыва-
ния защиты, что позволит обезопасить как микроконтроллер, так и про-
грамматор при ошибках в монтаже контроллера, при неверном подключе-
нии питающих проводников, а также при коротких замыканиях.
Следует предварительно рассчитывать ток потребления системы и уста-
навливать соответствующий ток срабатывания защиты перед включением.
-10-


1.4. Дополнительные сведения
Указанным условиям соответствуют источники питания постоянного
тока серии Б5-хх (например, Б5-44). Впрочем, вы можете сделать источ-
ник питания самостоятельно или даже питать микроконтроллер и про-
грамматор от батареек.
1.4. Дополнительные сведения
Чтобы решить, какой именно микроконтроллер AVR наилучшим обра-
зом подойдет для вашей задачи, необходимо сравнить возможности всех
выпускаемых микроконтроллеров AVR. Таблица параметров выпускаемых
микроконтроллеров AVR находится по адресу: http://www. atmel.
com/dyn/recources/prod_documents/doc4004.pdf.
Статьи о микроконтроллерах AVR, в том числе и обзоры, на русском
языке можно найти на сайте http://www.atmel.ru/.
При разработке возникает необходимость в профессиональной кон-
сультации. Попробуйте получить ответ на ваш вопрос на русском сайте ht-
tp://vmw.atmel.ru/. Получить специфическую информацию, которой не
располагают специалисты русского сайта, можно в корпорации Atmel. Ин-
формация на страничке http://www.atmel.com/dyn/general/contact.asp помо-
жет вам разыскать адрес электронной почты службы технической под-
держки.
Полезно просматривать материалы телеконференций по микрокон-
троллерам, их адреса можно найти с помощью поисковых машин, введя в
строку запроса фразу «конференция по микроконтроллерам».
11-


Глава 2. Первый проект:
контроллер сигнализации
Основные цели этой главы:
• ознакомить читателя с основными этапами разработки контроллера
и максимально быстро обучить приемам работы в среде разработки
программ для микроконтроллеров AVR Studio 4.08;
• разобраться с организацией и работой портов ввода/вывода;
• понять принцип работы аппаратных прерываний микроконтроллера;
• пройти этапы разработки контроллера от схемы до отладки про-
граммы.
Разработка простого устройства сигнализации, подходящего для защи-
ты помещений от вторжения, — удобный пример, не перенасыщенный
техническими деталями.
2.1. Постановка задачи
Пусть требуется изготовить простой контроллер сигнализации, рабо-
тающей в следующих режимах:
• ожидание;
• вторжение;
• штатное отпирание двери;
• отпирание изнутри.
2.1.1. Устройства, подключаемые к контроллеру, и
параметры входных и выходных сигналов
Питание сигнализации производится от автомобильного аккумулятора
(+12 В). Аккумулятор подзаряжается от сети переменного тока через за-
рядное устройство, которое здесь не рассматривается. Исполнительные
устройства сигнализации питаются непосредственно от аккумулятора.
На дверь устанавливается кнопка. При запертой двери кнопка нажата,
а ее контакты разомкнуты, при отпирании двери или взломе контакты
замкнуты.
-12-


2.1. Постановка задачи
Контроллер должен управлять электрическим замком. Открывание
производится подачей на соленоид замка напряжения +12 В. При отсутст-
вии напряжения на соленоиде замок запирается автоматически под дейст-
вием пружинного механизма.
Пара контактов кодового устройства замыкается на короткое время
после того, как кнопки устройства нажаты в определенной последователь-
ности.
При нажатии кнопки открывания замка внутри помещения замок от-
крывается без ввода кода.
Для сигнализации используется светодиод на удаленном пульте, а так-
же сирена. Для включения сирены на нее должна быть подана импульсная
последовательность, частота повторения импульсов 1 кГц, амплитуда им-
пульсов 12 В.
При отказе или разрядке аккумулятора замок открывается изнутри
вручную, сирена и светодиод не включатся, так как питания на них не
будет.
2.1.2. Логика работы контроллера
Режим ожидания
В этом режиме контакты кнопки, установленной на двери, замкнуты,
контакты кодового устройства разомкнуты, сирена и светодиод выключе-
ны, ток через соленоид замка протекать не должен.
Режим вторжения
При взломе двери контакты кнопки, установленной на двери, замкну-
ты. Если предшествующего замыкания контактов кодового устройства не
было, это должно вызвать включение сирены и светодиода на удаленном
пульте. Сирена должна работать в прерывистом режиме: продолжитель-
ность звука и продолжительность пауз равны и должны составлять 0.5 с.
Выключение сирены и светодиода должно производиться внутри помеще-
ния отдельной кнопкой, расположенной на плате контроллера.
Режим штатного отпирания двери
После ввода кода в правильной последовательности кратковременно
замыкается пара контактов кодового устройства, к соленоиду замка
должно быть приложено напряжение 12 В в течение 2 с, замок отопрется.
Если дверь после этого будет открыта, замыкание контактов кнопки,
установленной на двери, не приведет к срабатыванию сирены и свето-
диода.
-13


2.1. Постановка задачи
Параллельно соленоиду и сирене (индуктивные нагрузки) подключе-
ны диоды, они защищают транзисторы VT1, VT2 и VT3 контроллера от то-
ков, возникающих в индуктивных нагрузках после снятия с них напря-
жения.
Питание схемы осуществляется от автомобильного аккумулятора.
Штриховой линией окружены компоненты, размещаемые на плате
контроллера. 10-контактный разъем ХР1 предназначен для подключения к
микроконтроллеру программатора.
В устройстве используется микроконтроллер AT90S2313, для питания
которого необходимо напряжение, не превышающее 6 В. Для получения
стабилизированного напряжения питания +5 В применена микросхема
7805 (DA1).
Если цепь DOOR замкнута на общий провод кнопкой SA1, то в цепи
устанавливается НИЗКИЙ логический уровень; при отсутствии такого за-
мыкания в цепи поддерживается ВЫСОКИЙ логический уровень через
резистор Ri, соединенный с источником напряжения +5 В. То же справед-
ливо для кнопок SA2, SA3, резисторов J?2, ^з и цепей CODE и OPEN.
НИЗКИЙ логический уровень близок к О В, ВЫСОКИЙ логический
уровень близок к напряжению питания микроконтроллера, составляюще-
му для этой схемы +5 В.
Резистор /?4 '^ конденсатором Cj обеспечивают аппаратный сброс мик-
роконтроллера при включении питания. При отсутствии напряжения или
его пропадании конденсатор Cj оказывается разряженным. После появле-
ния напряжения питания на контакте RESET микроконтроллера удержи-
вается НИЗКИЙ логический уровень до тех пор, пока конденсатор Сг не
зарядится через резистор R^.
Для сброса программы (выключения сирены и светодиода после втор-
жения) в схему введена кнопка SA4, при замыкании контактов которой на
линии RESET микроконтроллера устанавливается НИЗКИЙ уровень, что
вызывает аппаратный сброс микроконтроллера.
Для управления мощной нагрузкой, питающейся большим напряже-
нием, служат транзисторы VT1, VT2 и VT3.
Если на выходе микроконтроллера, соединенного с базой транзистора
через резистор, сформируется ВЫСОКИЙ уровень, транзистор откроется.
Тогда подключенная к его коллектору цепь нагрузки соединится с общим
проводом через малое сопротивление транзисторного перехода коллек-
тор—эмиттер, почти все напряжение аккумулятора будет приложено к на-
грузке.
Когда на выходе микроконтроллера НИЗКИЙ уровень, транзистор за-
крыт, сопротивление его перехода коллектор—эмиттер очень велико, на-
пряжение на нагрузке оказывается близким к нулю.
15


Глава 2. Первый проект: контроллер сигнализации
Таким образом, для срабатывания одной из нагрузок, подключен-
ных к схеме, на соответствующем выходе микроконтроллера надо
сформировать ВЫСОКИЙ уровень, для прекращения работы на-
грузки — НИЗКИЙ уровень.
2.1.4. Словесное описание алгоритма работы контроллера
После включения питания по аппаратному сбросу
• линии порта D микроконтроллера DD1, соединенные с контактами кно-
пок SA1, SA2 и SA3, должны быть сконфигурированы как входные;
• линии порта В, управляющие нагрузками, необходимо сконфигури-
ровать как выходные;
• на линиях порта В установить НИЗКИЕ уровни (нагрузки — солено-
ид замка, сирена и светодиод — выключены).
Режим ожидания
Контроллер находится в состоянии ожидания, необходимо организо-
вать циклическую проверку состояния линий порта D.
Режим штатного отпирания двери
При появлении НИЗКОГО уровня в цепи CODE (введен правильный
код, переход в режим штатного открывания двери) сформировать
ВЫСОКИЙ уровень на линии LOCK, управляющей соленоидом замка;
удерживать уровень в течение 2 с для отпирания замка.
Через пять секунд после запирания замка проверить уровень в цепи
DOOR. Если в цепи ВЫСОКИЙ уровень (дверь не открывали гши успели за-
крыть), контроллер должен вернуться в режим ожидания. Если уровень
НИЗКИЙ (дверь еще открыта) — ожидать появления ВЫСОКОГО уровня
(запирания двери), после чего перейти в режим ожидания.
Режим отпирания двери изнутри
При появлении НИЗКОГО уровня в цепи OPEN сформировать
ВЫСОКИЙ уровень на линии LOCK, управляющей соленоидом замка;
удерживать уровень в течение 2 с для отпирания замка.
Через пять секунд после запирания замка проверить уровень в цепи
DOOR. Если в цепи ВЫСОКИЙ уровень (дверь не открывали или успели
закрыть), контроллер должен вернуться в режим ожидания. Если уровень
НИЗКИЙ (дверь еще открыта) — ожидать появления ВЫСОКОГО уровня
(запирания двери), после чего перейти в режим ожидания.
-16-


2.2. Начинаем работу с AVR Studio
Режим вторжения
При появлении НИЗКОГО уровня в цепи DOOR (дверь открыта)
сформировать ВЫСОКИЙ уровень на линии HL для включения светодио-
да, на линии ALARM сформировать импульсную последовательность, вы-
зывающую прерывистый звуковой сигнал сирены. Для этого чередовать
импульсные последовательности с частотой повторения 1 кГц в течение
0.5 с (паузы также 0.5 с).
Возвращение в режим ожидания должно происходить при временном по-
явлении НИЗКОГО уровня на контакте RESET микроконтроллера, что обес-
печивается нажатием кнопки SA4 или выключением-включением питания.
2.2. Начинаем работу с AVR Studio
Установка AVR Studio обычно проходит гладко. Для начала установку
стоит сделать, просто соглашаясь со всеми появляющимися предложения-
ми программы-установщика.
2.2.1. Создание первой программы на Ассемблере
Подготовка к работе
Для начала необходимо распаковать архив avrOOO.zip.
Распакуйте файл avrOOO.zip (его скачали вместе с AVR Studio, см. под-
раздел 1.1) в папку C:\AVR\def.
В результате произведенной распаковки папка C:\AVR\def будет со-
держать файлы *def.inc, в которых хранятся предопределенные имена ре-
гистров и констант микроконтроллеров AVR. Именно это имя папки для
файлов *def.inc (C:\AVR\Def) будет использоваться в примерах программ,
приведенных в книге.
В папке C:\AVR для каждого нового проекта будем создавать новую
папку для хранения всех файлов, относящихся к проекту.
Запустите AVR Studio. Появившееся окно (Рис.2) предоставляет возмож-
ность открыть существующий или создать новый проект. Если флажок «Show
this dialog on open», расположенный в левом нижнем углу, оставить установ-
ленным, окно будет появляться при каждом запуске программы. Так как в те-
чение одного сеанса может понадобиться работать с разными проектами, за-
кроем это окно, щелкнув по кнопке Cancel, а затем создадим новый проект,
пользуясь меню AVR Studio. В оставшемся на экране окне AVR Studio в пер-
вой строке находятся заголовки меню File, Project, View, Tools, Debug и Help.
Для ознакомления с возможностями AVR Studio откройте меню
Help/AVR Studio User Guide. Для этого надо установить указатель мышки
на слове Help, щелкнуть мышкой (нажать левую кнопку мыщки), в от-
-17-


Diaea 2. Первый проект: контроллер сигнализации
«*.asm» на «Все файлы»). Двойным щелчком откройте добавившийся к
списку Assembler файл 2313def.inc?\, на экране поверх окна программы
появится окно с содержимым интересующего нас файла. Большую часть
файла составляют директивы .equ, позволяющие присваивать имена кон-
стантам, например .equ PORTB = $18.
Конечно, можно использовать в программе вместо имени ЮКТВ кон-
станту $18, но удачно подобранные имена значительно облегчают чтение и
понимание программ. Это же касается и директивы .def. Отличие состоит в
том, что она позволяет назначить имена регистрам.
Замечу, что одним и тем же константам или регистрам можно присво-
ить несколько имен в зависимости от их назначения в том или ином блоке
программы. Например, в файле 23l3def.inc константе 2 назначено не-
сколько имен: PD2, РВ2, CS02. В нашей программе директива .equ door =
PD2 назначает константе 2 имя door, но константа представлена не явно, а
одним из своих имен.
В связи с ограниченным количеством регистров в микроконтроллере
одни регистры в разных блоках программы могут использоваться для раз-
ных целей под разными именами. Так, в одном месте регистр г 18 может ис-
пользоваться как счетчик циклов (counter), в другом — как регистр вре-
менного хранения (store), поэтому удобно для этого регистра назначить
соответствующие имена: .def store = rl8 или .defcntr = rl8. В окне Program
Output после ассемблирования программы появится предупреждение
(warning) о том, что регистру уже назначено имя.
Поскольку обращение какк.5/оге, так и к cntr—это обращение к регистру
г18, надо избегать конфликтов при их совместном использовании, ведь из-
менение содержимого store автоматически изменяет содержимое cntr
Блок ссылок на обработчики прерываний
Обработчики прерываний входят в состав программы микроконтрол-
лера и могут размещаться в любой ее части. Поэтому для обнаружения на-
чала обработчика конкретного прерывания в программе его адрес заносит-
ся в фиксированную ячейку памяти программ.
В предложенном варианте программы только одно прерывание —
RESET Адрес подпрограммы, обрабатывающей прерывание RESET, всегда
хранится в ячейке памяти программ с адресом 0x0000.
Обработчик этого прерывания выполняется после изменения уровня с
НИЗКОГО на ВЫСОКИЙ на контакте RESET микроконтроллера. В
нашей схеме это происходит после подачи питания на микроконтроллер
или после отпускания кнопки SA4 с некоторой задержкой (см. описание
схемы).
Чтобы обозначить начало обработчика, в программе ставится метка (в
нашей программе это метка RESET), а ее адрес надо записать в нулевую
-28


2.2. Начинаем работу с AVR Studio
ячейку памяти программ. В программе это записывается в нулевой ячейке
памяти так: rjmp RESET. Лиректива .cseg указывает компилятору, что код
программы должен быть помещен в кодовый сегмент памяти (память про-
грамм); директива .org О сообщает, что код следует размещать, начиная с
нулевого адреса указанного сегмента памяти.
Каждый тип микроконтроллеров AVR имеет индивидуальный набор
прерываний (для микроконтроллера AT90S2313 их одиннадцать).
Итак, в нулевой ячейке хранится адрес начала обработчика RESET:, в
следующих десяти ячейках в строгой последовательности должны хра-
ниться адреса оставшихся десяти прерываний микроконтроллера
AT90S2313. Так как мы не используем эти прерывания, вместо адресов по-
мещаются пустые команды пор. Однако в тексте приведенной программы
за каждой командой пор следует закомментированная ссылка (перед ней
ставится точка с запятой) на подпрограмму обработки прерывания. Так,
если понадобится использовать прерывание от аналогового компаратора,
следует убрать последний оператор пор и точку с запятой за ним, тогда в
этой строке окажется команда ijmp ANACOMP. В программу понадобится
добавить метку ANACOMP:, которая обозначит начало подпрограммы об-
работки прерывания от аналогового компаратора. Завершить подпрограм-
му обработки прерывания надо командой reti.
Как узнать, в какой последовательности и сколько прерываний должно
быть в блоке?
Такой блок можно найти в полном техническом описании соответст-
вующего микроконтроллера в разделе /Interrupts/Interrupt Vectors/ или
/Architectural Overview/Reset and Interrupt Handling либо в конце файла
*def.inc.
Можно скопировать блок из раздела /Interrupts/Interrupt \fectors/ или
/Architectural Overview/Reset and Interrupt Handling полного технического
описания микроконтроллера (файл pdl) и вставить его в программу, убрав
затем адреса, стоящие в начале каждой строки (Sxxx). Вместо не исполь-
зуемых в программе прерываний надо вставить команды пор.


Основная программа
Основная программа начинается командой с меткой RESET:.
Первая пара операторов определяет адрес начала стека в оперативной
памяти микроконтроллера. Работу стека мы еще рассмотрим, поэтому
сейчас заметим, что стек — это область оперативной памяти или оператив-
ного запоминающего устройства микроконтроллера (далее — ОЗУ). Стек
предназначен в основном для обслуживания подпрограмм; при занесении
в стек нескольких величин адрес каждой последующей величины умень-
шается (у первой — самый большой адрес, у последней — самый малень-
кий). Поэтому стек обычно располагают в конце ОЗУ, начиная с послед-
ней ячейки ОЗУ.
Мы прервались после первого шага отладки: желтая стрелка указателя
отладчика установлена против первой команды rjmp RESET.
Откройте окно просмотра состояния процессора (в окне Workspace
двойной щелчок по строке Processor). Далее слова «просмотр состояния»
будут опускаться.
В окне процессора указана выбранная нами тактовая частота 4 МГц; в
окошках счетчика тактов микроконтроллера (Cycle Counter), указателя
стека (Stack Pointer), счетчика команд (Program Counter), времени выпол-
нения (Stop Watch) — нули.
На Рис. 10 показано окно Workspace, в котором отображается состоя-
ние процессора во время отладки программы.
Откройте окно памяти (меню View/Memory, Рис. 11).
-30- \


Глава 2. Первый проект: контроллер сигнализации
Открывшееся окно Alarm закрывает собой окно программы Alarm.asm,
поэтому его лучше сместить, как это показано на Рис. 12.
В первой колонке окна Alarm находится адрес двухбайтной ячейки па-
мяти программ, во второй колонке — код команды, хранящейся в этой
ячейке, в третьей — наименование команды, такое же, как и в нашей про-
грамме, в четвертой — операнды, приведенные к приемлемому для микро-
контроллера виду. Например, вместо имени tmp здесь будет имя регистра
R16, вместо метки RESET: — смещение адреса и так далее. В пятой колон-
ке находятся комментарии. Здесь могут быть представлены, например, ре-
зультаты адреса переходов или константы в шестнадцатеричном, двоич-
ном и десятичном видах.
По существу, в этом окне представлен код программы в дизассембли-
рованном виде.
Во второй колонке строки с адресом +00000000: — тот же код СООА,
только с измененной последовательностью байтов, который находится в
нулевой ячейке памяти программ. Это двухбайтный код, соответствующий
команде rjmp RESET. СО — код команды rjmp, ОА — смещение адреса, кото-
рое надо добавить к содержимому счетчика команд для перехода к обра-
ботчику прерывания, начинающемуся меткой RESET.
В результате выполнения этой команды в счетчике окажется адрес ОА,
для перехода к следующей команде содержимое счетчика увеличится на
единицу, в результате следующей выполнится команда, расположенная по
адресу ОВ (смотрите пятую колонку строки).
С адреса 00000001 по адрес ОООООООА следуют коды 0000, соответствую-
щие нашим пустым командам пор, и так далее.
Вероятно, читатель уже уловил связь между строкой в программе и ко-
дом, исполняемым микроконтроллером.
Новый шаг отладки вызвал бы перемещение указателя отладчика к
следующей команде как в окне программы, так и в окне Disassembler
Не многовато ли для первого шага отладки?
Если материал для вас пока не очень понятен — не расстраивайтесь,
просто запомните, что вопрос о такой-то возможности отладчика рассмат-
ривался. Тогда, при необходимости, вы сможете вернуться к этой части
книги. Поэтому дать максимум материала по отладке целесообразно имен-
но при рассмотрении простейшей программы, чтобы не возвращаться к
нему при рассмотрении более сложных программ.
Вернемся к программе, закроем окна Memory и Disassembler
Выполним второй шаг отладки, нажав клавишу F11. Далее подобный
текст будет заменен фразами «выполним FI1:», «нажмите F11:» или просто
«F11:».
В окне Processor состояние счетчика стало равным $В, что соответству-
ет адресу следующей команды, в счетчике тактов — 2, то есть команда rjmi
-32-


Глава 2. Первый проект: контроллер сигнализации
Заметим, что все сказанное о порте В относится к любому другому поп
ту йвода/вывода. Для порта D, например, наименования портов в про
грамме изменятся на PORTD, DDRD и PIND. Аналогичное изменение на
именований надо делать для портов А и С при использовании микрокои
троллеров, имеющих эти порты.
Надо заметить, что аппаратное прерывание RESET автоматически об-
нуляет триггеры портов ввода/вывода.
Продолжение отладки программы
Переменная tmp обнулена. В окне Workspace раскрываем PORTB к
PORTD, щелкнув по знаку плюс слева от них.
Дважды нажимаем F11: состояние PORTB и PORTD в окне Workspace
не изменилось, так как порты, которые инициализировались командами
clr tmp, out DDRD,tmp и out PORTBjmp, уже были обнулены отладчиком, а в
реальной схеме были обнулены аппаратным прерыванием RESET. Поэто-
му перечисленные команды можно опустить, но их присутствие позволит
сделать некоторые комментарии.
Трижды нажимаем F11: в переменной tmp появилась величина OxFF
илиОЬПППП.
В W)rkspace/DDRB и PORTD установлены все флажки. Далее такой
записи будет соответствовать «все разряды DDRB и PORTD установлены».
Нажать F11: все разряды PIND установлены. Это физически бессмыс-
ленная операция, об этом говорилось выще. Однако не установленные
PIND в окне Workspace эквивалентны одновременному нажатию кнопок
SA1, SA2 и SA3 схемы контроллера сигнализации (НИЗКИЕ уровни на
входных линиях DOOR, CODE и OPEN). Этим способом установить ли-
нии проще, чем вручную при каждой новой отладке, щелкая мыщкой в
окошках для установки галочек.
Нажимаем дважды F11: произощла инициализация сторожевого тай-
мера (Witchdog Timer).
Сторожевой таймер защищает микроконтроллер от зависания. Его ра-
бота не зависит от тактового генератора микроконтроллера, она определя-
ется отдельным внутренним генератором микроконтроллера. Если про-
граммно не определить режим работы сторожевого таймера, он будет вы-
зывать прерывание RESET через каждые 16 мс при напряжении питания
+5 В (частота генератора сторожевого таймера сильно зависит от
напряжения питания). Периодичность прерывания может быть задана
программно, мы определили период повторения прерываний примерно в 2
с при напряжении питания +5 В. Сторожевой таймер можно и отключить,
но это вряд ли понадобится.
-38


2.2. Начинаем работу с AVR Studio
Команды сброса сторожевого таймера wdr расставляются в программе
расчетом, чтобы сторожевой таймер не успевал сбросить микро-
^° Если программа зависает (останавливается, зацикливается), очередная
манда сброса остается невыполненной, происходит сброс микрокон-
оллера, программа запускается сначала. Нажимаем F11:, командой clt
очищается флаг Т регистра флагов. Во (Ьлаг Т будет заноситься
информация о том, разрешено или запрещено отпирание двери.
Далее в бесконечном цикле, начинающемся меткой main: и заканчи-
вающемся командой rjmp main происходят следующие события:
1. В начале каждого цикла сбрасывается сторожевой таймер командой
wc/r.
2. Проверяется состояние линии CODE командой sbis PIND,code.
3. Когда на линии CODE контроллера ВЫСОКИЙ уровень, пропус-
кается одна команда, следующая за командой sbis (обращайте вни-
мание на наименование команд — они связаны с определяемыми
командой действиями. Так, sbis — это Skip if Bit in Ю register Set, то
есть пропустить , когда разряд в регистре
ввода/вывода установлен).
4. То же происходит при проверке состояний линий OPEN и DOOR.
5. Если на какой-то из перечисленных линий НИЗКИЙ уровень
(замкнута соответствующая кнопка), следующая команда вызова под-
программы rcall выполняется, происходит вызов подпрограммы.
6. Предпоследняя команда clt очистит флаг Т, если он бьш установлен
в какой-либо подпрограмме.
Нажмите F11 восемь—десять раз: понятно, что цикл повторяется. Об-
ратите внимание, за какое число тактов команда sbis выполняется при вы-
полнении условия (проверяемый разряд порта установлен, следующая ко-
манда будет пропущена). Для этого наблюдайте изменение состояния Cy-
cle Counter в окне Processor.
Переместитесь с помощью вертикального скроллинга в начало про-
граммы и посмотрите, какому разряду или контакту порта P1ND соответ-
ствует линия code (она соответствует контакту PD3). Сбросьте флажок в
третьем разряде P1ND (в окне Workspace убрать флажок с цифры 3).
Установите курсор на команде sbis PIND,code и нажмите Ctrl+ F10
(меню Debug/Run to cursor): вы сразу перешли к команде, на которой был
установлен курсор. Сбросив 3-й разряд PIND, вы имитировали нажатие
кнопки SA2. При нажатии F11 проследите, за какое число тактов
выполнится команда sbis при невыполнении условия (проверяемый разряд
в порте не установлен, следующая команда не пропускается).
-39-


Глава 2. Первый проект: контроллер сигнализации


С^


По мере
освоени
я
отладчи
ка
рассмот
рим
эффекты
от
использ
ования
горячих
клавиш
(F10,
F11, Ctrl
+ FIG и
так
далее),
функци
и
большин
ства из
них
отражен
ы в
меню
Debug.
Открыва
я это
меню^
можно
использ
овать
мышь
вместо
клавиат
уры, а
также
ознако-
миться с
команда
ми
отладчи
ка и
соответс
твующи
ми им
горячим
и
клавиш
ами.


Часто бывает необходимо определить точное число тактов, требующееся
для выполнения последовательности команд. В списке команд микрокон-
троллера указывается число тактов, за которое выполняется каждая из них,
однако для части команд — команд ветвления — существуют варианты, за-
висящие оттого, выполняется условие, проверяемое командой, или нет.
В предыдущем примере с помощью отладчика бьшо проверено число
тактов, требующееся для выполнения команды sbis при выполнении усло-
вия (2 такта) и при его невыполнении (1 такт). Рекомендую сделать соот-
ветствующие пометки в списке команд, а при отладке самостоятельно
проверить некоторые из команд ветвления на предмет числа тактов, тре-
бующихся для их выполнения.
Указатель отладчика переходит на команду, вызывающую подпрограм-
му отпирания замка: rcall OpenLock.
Снова откроем окно Memory. Если вы не закрывали его, перейдите в
режим просмотра данных Data (если выбран просмотр памяти Program,
надо щелкнуть по окошку со словом Program, в открывшемся списке вы-
брать Data (Рис.11)). В соседнем окошке — адрес начала памяти данных
0x0060 в адресном пространстве микроконтроллера. Адрес последней
ячейки памяти OxOODF, это наша константа RAMEND, а также адрес начала
стека.
Заметьте величины, хранящиеся в Stack Pointer и Cycle Counter окна
Processor, а также в последней ячейке окна Memory, затем нажмите F11.
Посмотрите, как изменились названные величины: для перехода в
подпрограмму потребовалось 3 такта микроконтроллера, в указателе стека
(Stack Pointer) хранится адрес OxOOOOOODD (или OxOODD, или просто
OxDD). Этот адрес на 2 меньше предыдущего адреса OxDF, то есть адрес
возврата из подпрограммы занимает 2 ячейки памяти, их адреса OxDE и
OxDF, в них хранится адрес 001А команды, которая будет выполнена сразу
после возврата из подпрограммы.
Следите за изменением состояния порта В в окне Workspace.
Нажмите F11: установился второй разряд PORTB (P0RTB2), в следую-
щем такте микроконтроллера (при выполнении следующей команды, уже
не связанной с портом В) этот же разряд установится и на линии микро-
контроллера PINB2, следовательно, и на контакте РВ2. При этом транзи-
стор VT1 откроется, через соленоид замка потечет ток, замок откроется.
-40-


2.2. Начинаем работу с AVR Studio
Нам надо, чтобы замок был открыт в течение 2 с. Для тонового сигнала
сирены мы организуем подпрограмму с задержкой 0.5 мс (это половина
дцриода сигнала частотой 1 кГц, необходимой для сирены). Для организа-
ции пауз в звучании сирены организуем подпрограммы задержки на 500
мс, вызывая 1000 раз подпрограмму задержки на 0.5 мс, для 2-секунд-Н0Й
и 5-секундной задержек вызовем задержку на 500 мс соответственно 4 и 10
раз.
Нажимаем F11: произошел переход в подпрограмму задержки на 500 мс.
Продолжаем следить за работой стека. Содержимое Stack Pointer (окно Pro-
cessor) уменьшилось на 2 и стало равно OxDB, в ячейки памяти OxDC и OxDD
помещен адрес возврата из подпрограммы 0022 (окно Memory).
Откройте окно Watches (меню View/Watch) и добавьте две переменные
ХН и XL (так определены регистры г27 и г26 в файле *def.inc).
Откроем View/Disassembler: в окне Alarm за указателем отладчика сле-
дуют две команды: Idi К26,(кЕ8я Idi R27,0x03.
Десятичная запись числа 1000 соответствует шестнадцатеричному
представлению ОхОЗЕ8; старший байт числа 0x03 загружается в регистр
R27, младший — в R26. Эта пара регистров именуется соответственно
XH:XL или регистр X. В микроконтроллере есть еще две пары YH:YL
(R28:R29), или регистр У, и ZH:ZL (R30:R31), или регистр Z (не путать с
флагом Z в регистре флагов).
Приятное отличие парных регистров состоит в том, что командой adiw
к двухбайтному слову, хранящемуся в паре регистров, можно добавить
константу, а командой sbiw — вычесть константу. Команды обращения к
памяти данных (ОЗУ) также не обходятся без них, а регистр Z обслуживает
и обращение к памяти программ.
Вернемся к окну программы Alarm.asm.
Дважды нажимаем F11, загружая число циклов 1000 в регистр X. Снова
нажимаем F11, наблюдая работу стека (Stack Pointer = ОхВ9, адрес возврата
0045). Теперь мы вошли в подпрограмму задержки на 0.5 мс. Трижды
нажимаем F11: сторожевой таймер сброшен, в пару регистров YH:YL за-
гружено число циклов 497.
Как рассчитывается число циклов? Для начала определяем, что будет в
цикле. В нашем цикле всего две команды: d05_l:sbiwYL,l и brned05__l.
Цикл будет повторяться, пока содержимое У не станет равным нулю.
Первая команда вычитания единицы из содержимого регистра У вы-
полняется за два такта. Вторая команда проверяет состояние флага Z в ре-
гистре флагов. Пока результат предьщущей операции не равен нулю (для
этого фрагмента программы — пока содержимое У не достигло нуля, то
есть УН = О и YL = 0), флаг Z не установится, произойдет переход на метку
d051:, команда выполнится за 2 такта. После установки флага Z выполне-
ние цикла завершится, команда будет выполнена за 1 такт.
-41-


Гпава 2. Первый проект: контроллер сигаализации
Итак, для получения общего числа тактов, обеспечивающих задержку
на 0.5 мс, надо просуммировать следующее число тактов:
• 3 такта команды rcall (вход в подпрограмму);
• 3 такта команд wdr, Idi, Idi в начале подпрограммы;
• 4 такта команды ret возврата из подпрограммы;
• 4 такта-(число циклов) - 1 (в последнем цикле команда Ьте выпол-
няется за 1 такт).
С другой стороны, общее число тактов, обеспечивающих задержку на
0.5 мс при частоте тактового генератора 4 МГц, составляет 4000000 [Гц] х
0.0005 [с] = 2000 тактов.
Составим уравнение: 3 + 3 + 4 + (4-N) - 1 = 2000, где N — искомое
число циклов. Отсюда N = 1991/4, результат получится с остатком. Возь-
мем ближайшее меньшее делимое 1988, тогда число циклов N = 497, а не-
достающие до 1991-го три такта (1991...1988) мы могли бы добавить, вста-
вив три пустые команды перед циклом.
Аналогичным образом можно было бы точно рассчитать число циклов
для обеспечения задержек в 500 мс (подпрограмма d500ms). Но тогда при-
шлось бы сократить время выполнения подпрограммы d05ms (задержка на
0.5 мс) с тем, чтобы учесть время на ее вызов из подпрограммы d500ms.
Там же, где нужно точное время выполнения подпрограммы d05ms, ком-
пенсировать сокращенное время вводом пустых команд перед вызовом
этой подпрограммы.
В окно Watches добавьте переменные YH и YL.
Нажмите 10... 15 раз F11, следя за изменением этих переменных. В окне
Processor установите мышкой флаг Z регистра флагов, нажмите F11 пару
раз: флаг Z сбросился после команды sbiw, поскольку результат оказался
ненулевым.
В окне Watches измените значение, хранящееся в YL, для этого выпол-
ните двойной щелчок мышкой напротив переменной YL в колонке Wue,
измените находящееся там значение на 0x01 (достаточно нажать клавишу
«1», затем клавишу «ENTER»). Теперь сделайте одно или два нажатия F11
для однократного выполнения команды sbiw: YL = О, но установки флага Z
(окно Processor) не произошло. Хотя команда записывается как sbiw YL,1
(именно YL!), оценка результата производится по общему содержимому
YH:YL (01:00).
Следя за изменением YH и YL, дважды нажмите F11.
Теперь замените содержимое YL на единицу (OxFF на 0x01). Сделайте
одно или два нажатия F11 для однократного выполнения команды sbiw:
флаг Z установился, так как Y = 0. Нажав F11, покидаем цикл.
Вы, конечно, заметили, что значение переменной можно изменять по
своему усмотрению в окне Watches в процессе отладки.
42


2.2. Начинаем работу с AVR Studio
Следующая команда, на которой остановился указатель, ret — возврат
3 подпрограммы на команду, адрес которой 0045 загружался в стек по-
следним (окно Memory, ячейки памяти данных OxOODA и OxOODB).
Перейдем в окно Disassembler, нажав F11, увидим переход на команду с
названным адресом. Содержимое Stack Pointer возросло на 2 и теперь в
стеке только два адреса возврата из подпрограмм, вызванных ранее: 0022 и
001А. Адрес 0045 не изменился, но он уже не имеет значения, так как нахо-
дится вне пределов стека.
Вернемся к программе. Нажимая клавишу F10 (не F11!), снова добе-
ремся до команды rcall dOSms. В окне Workspace/Processor двойным щелч-
ком очистим содержимое Stop Watch, заметим содержимое Cycle Counter,
теперь нажмем F10, чтобы выполнить подпрограмму dOSms, не заходя в
нее.
На выполнение подпрограммы ушло 499.25 мкс вместо 500 мкс (0.5 мс)
или 1997 тактов микроконтроллера вместо 2000, что ровно на три такта
меньше, как и получилось при расчете числа циклов, проведенном выше
(напомню, что три команды пор не добавлялись). Проверьте указанное
время и число тактов в соответствующих окошках окна Processor.
Далее подпрограмма dOSms будет вызываться из подпрограммы dSOOms
множество раз, интереса это не представляет, поэтому установим курсор
на команду ret, последнюю в подпрограмме dSOOms.
Теперь нажмем Ctrl + F10 и дождемся перемещения указателя отладчи-
ка к команде, на которую установлен курсор. На компьютере с невысокой
производительностью это может занять несколько минут. Если вы облада-
тель такого компьютера и ожидание затянулось — нажмите Ctrl + F5 для
остановки, замените в окне Watches переменные YH и ХН на нули, а YL и
XL на единицы, тогда вы сможете быстро покинуть подпрограмму, снова
установив курсор на команде ret подпрограммы dSOOms и нажав Ctrl -Ь F10.
В подобных случаях на время отладки удобно сократить число цик-
лов или временно вставить перед первой командой подпрограммы
команду возврата ret. Важно не забыть восстановить программу пе-
ред ассемблированием ее окончательного варианта.
Нажав F11, покидаем подпрограмму dSOOms, проверяем, как изменил-
ся указатель стека и в каких ячейках памяти хранился адрес возврата из
подпрограммы.
Чтобы не затягивать ожидание, добавьте команду ret сразу после метки
dSOOms:, после ввода команды обязательно нажмите клавишу ENTER.
Пометим маркером команду main: wdr. Для этого установим курсор в
строке с этой командой и нажмем Ctrl + F2, слева от строки появится си-
ний квадрат маркера.
43-


Глава 2. Первый проект: контроллер сигнализации
Установка и удаление маркеров производятся нажатием Ctrl + Р2
Переходы от маркера к маркеру вниз по программе производится
по нажатию F2. Переходы вверх по программе производятся по на-
жатию Shift + F2.
Снова ассемблируем программу (F7), начнем отладку (меню De-
bug/Start Debugging или соответствующая кнопка на панели инструмен-
тов), нажимаем F2 для быстрого перехода к строке, помеченной маркером-
курсор автоматически установится в этой строке. Нажмем Ctrl + F10 (Ru^
to cursor).
Далее все, как в предыдущем сеансе отладки; сбрасываем PIND3; два-
жды нажмем F11: указатель отладчика установился на первую команду
подпрограммы OpenLock:.
Следующее нажатие F11: установился P0RTB2; далее нажать F10: за-
мок открыт (PINB2 установлен), выполнена первая задержка на 500 мс;
еще трижды нажать F10; выполнены еще три задержки на 500 мс.
Четыре задержки по 500 мс составили обшую задержку в 2 с, в течение
которой замок был открыт. Так как мы сразу же возвращались из подпро-
граммы по команде ret, введенной для ускорения отладки, в окне Processor
время выполнения задержки составляет всего несколько микросекунд
вместо 2 с.
Нажать F11: P0RTB2 сбросился; еще раз нажать F11: замок закрылся
(PINB2 сброшен), в переменную tmp загрузилось число циклов (10) обра-
щения к задержке в 500 мс.
Поскольку работу цикла мы рассматривали, установим курсор на ко-
манде ret, завершающей подпрограмму отпирания замка OpenLock: и на-
жмем Ctrl + F10, затем нажмем F11. Обратите внимание, что в регистре
флагов (окно Wbrkspace/IO AT90S2313/CPU/SREG) по команде set (она
расположена перед командой ret) установился флаг Т; указатель стека сно-
ва указывает на последнюю ячейку памяти данных, так как мы вышли из
подпрограммы самого верхнего уровня, и стек пуст.
Итак, мы проверили замыкание кнопки кодового устройства, открыли
на 2 с замок, подождали 5 с и установили флаг Т — признак того, что дверь
может находиться в открытом состоянии.
Теперь мы снова в основной программе. Прежде чем продолжить от-
ладку, отпустите кнопку кодового устройства (установите PIND3 в окне
Wbrkspace/lO/PortD)! Иначе мы повторим отпирание замка.
Выполним основную программу в пошаговом режиме до команды
rjmp main.
Команда cir очистит флаг Т. Это значит, что теперь открывание двери
будет соответствовать режиму взлома. Для проверки работы программы в
этом режиме сбросим разряд PIND2, что соответствует замыканию датчи-
-44


2.2. Начинаем работу с AVR Studio
тпирания двери. Теперь войдем в подпрограмму DoorlsOpen:, нажав
р^ 1 нужное для этого число раз.
Первая команда проверяет состояние флага Т, так как он сброшен, вы-
олняется вторая и следующие за ней команды.
Далее используйте уже полюбившиеся вам горячие клавиши для вы-
полнения пошаговой отладки с заходом в подпрограммы (F11), пошаговой
отладки без захода в подпрограмму (F10), перехода к команде, на которой
установлен курсор (Ctrl + F10). Сюда можно добавить еще и Shift + Fl 1;
используйте это сочетание клавиш, если вы по инерции зашли в подпро-
грамму нажав F11, но не хотите проходить подпрограмму в пошаговом ре-
жиме. Проверьте работу Shift + F11 после захода в подпрограмму dOSms:.
Посмотрим, что происходит в этой подпрограмме.
Команда sbi PORTB,hl устанавливает ВЫСОКИЙ уровень на контакте
РВО (сначала устанавливается PORTB0, в следующем такте микроконтрол-
лера устанавливается PINBO), вызывая отпирание транзистора VT3 (смот-
рите схему сигнализации) и включение светодиода VD3 на удаленном
пульте.
В пару регистров XH:XL загружается число повторений цикла, начи-
нающегося меткой NewPls: NewPls: wdr... brne NewPls.
В каждом из пятисот циклов командой sbi PORTB,alarm устанавливает-
ся ВЫСОКИЙ уровень на контакте РВ1 микроконтроллера, удерживаю-
щийся в течение 0.5 мс при выполнении подпрограммы dOSms, затем ко-
мандой сЫ PORTB,alarm устанавливается НИЗКИЙ уровень на этом кон-
такте и также удерживается 0.5 мс при выполнении подпрограммы dOSms.
В итоге на контакте РВ1 микроконтроллера генерируется импульсная по-
следовательность с длительностью импульса и длительностью паузы по
0.5 мс. Следовательно, период повторения импульсов составляет 1 мс, что
соответствует частоте повторения 1 кГц. Таких импульсов насчитывается
500, то есть длительность импульсной последовательности — 500 мс.
По окончании цикла вызывается подпрограмма dSOOms:, вызывающая
паузу в течение 500 мс, во время которой на контакте микроконтроллера
РВ1 продолжает удерживаться НИЗКИЙ уровень.
После паузы происходит безусловный переход в начало подпрограммы
и все повторяется, пока не будет произведен сброс.
Описанная импульсная последовательность управляет транзистором
VT2, к которому подключена сирена. Когда на сирену в течение 500 мс по-
ступают импульсы с частотой следования 1 кГц, она включается (издает
звук), во время паузы в течение 500 мс она выключается. Так продолжается
до тех пор, пока не произойдет сброс микроконтроллера либо при выклю-
чении питания с его последующим включением, либо при нажатии кноп-
ки сброса SA4.
Имитируем сброс микроконтроллера, нажав Shift + F5 (Reset).
-45-


Глава 2. Первый проект: контроллер сигаализации
Нажмем F2, затем Ctrl + F10 для быстрого перехода к циклу проверки
состояния входных контактов микроконтроллера, начинающемуся меткой
main:. Сбросим PIND4, что соответствует замыканию кнопки SA3 (откры-
вание замка изнутри помещения).
По ходу отладки снова попадаем в подпрограмму OpenLock:, которая
уже вызывалась при замыкании кнопки кодового устройства. Следова-
тельно, как правильный набор кода, так и нажатие кнопки открывания
замка внутри помещения вызывают одинаковые действия программы. В
схеме можно было соединить кнопки SA3 и SA2 с одним контактом мик-
роконтроллера. Однако при наличии свободных контактов микроконтрол-
лера делать этого не стоит, чтобы сохранить возможность изменять про-
грамму без изменения схемы для использования в других задачах.
Теперь будем считать, что при открывании замка дверь также открыли,
для этого сбросим PIND2; одновременно установим P1ND4, так как усло-
вие отпирания замка (сброшенное состояние P1ND4) уже проверено.
Нажимаем Shift + F11 для выхода из подпрограммы открывания замка
на 2 с, последующим ожиданием в течение 5 с и установкой флага Т, со-
стояние которого свидетельствует о том, что дверь может оставаться от-
крытой.
При продолжении отладки происходит проверка состояния контакта
микроконтроллера PD4 (проверяется соответствующее ему состояние
PIND2). Поскольку P1ND2 сброшен, выполнится подпрограмма
DoorlsOpen:.
Первая команда подпрограммы проверяет состояниефлагаТ, атаккакна
этот раз он установлен, происходит переход к метке NoClose:. В этой части
подпрограммы, состоящей всего из двух команд (NoClose: sbis PIND,door и
rjmp NoClose), возврат на метку NoClose: будет происходить до тех пор, пока
мы не установимразрядРШ02, что соответствует закрытию двери.
После установки этого разряда произойдет возврат в основную про-
грамму, в которой флаг Т будет сброшен. Последующее открывание двери
без замыкания кнопки кодового устройства или кнопки отпирания замка
изнутри будет воспринято программой как взлом.
Мы отладили программу во всех возможных режимах работы. Посмот-
рим, все ли учтено?
Все должно работать прилично, если использовать идеальные кнопки,
на самом деле при замыкании и размыкании контактов возникает эффект
дребезга, заключающийся в том, что, как при замыкании, так и при раз-
мыкании, контакт многократно замыкается-размыкается в течение не-
скольких десятков миллисекунд, пока не примет требуемого положения.
Опасен ли дребезг в нашей схеме?
Для кнопок кодового устройства и открывания изнутри дребезг не
представляет опасности, так как время дребезга значительно меньше вре-
-46-


2.2. Начинаем работу с AVR Studio
j^eHH выполнения подпрограммы открывания замка, вызываемой при за-
^ь1кании этих кнопок.
Для кнопки-датчика открывания двери дребезг опасен: вспомните вы-
ход из последнего рассмотренного цикла, начинающегося меткой NoClose:.
Дверь закрылась, после выхода из подпрограммы DoorlsOpen: флаг Т был
сброшен, и все это произошло за несколько микросекунд. В это же время
происходит дребезг контактов кнопки-датчика двери, следовательно, со-
стояние контакта микроконтроллера PD2 изменяется; теперь кратковре-
менное присутствие НИЗКОГО уровня на контакте означает взлом двери с
включением сирены и светодиода на пульте.
Значит, при закрытии двери может включиться сирена и светодиод.
Что можно предпринять? Проще всего добавить вызов подпрограммы
задержки на 500 мс, например, перед командой clt, очищающей флаг Т в
основной программе. Тогда при закрытии двери происходит выход из под-
программы DoorlsOpen:, а за время выполнения вставленной подпрограм-
мы задержки дребезг датчика-контакта двери завершится.
Еще одна неприятность — наводки на провода, идущие от кнопок. Они
могут возникнуть, например, при проведении сварочных работ вблизи на-
шего устройства.
Для устранения наводок можно ввести в схему фильтрующие конден-
саторы, установив их вблизи контактов микроконтроллера параллельно
кнопкам, а также снизить сопротивление резисторов R1, R2 и R3.
Другим вариантом является программная проверка состояния контак-
тов с некоторыми интервалами времени. В нашей программе можно после
обнаружения изменения состояния контактов проверить, что состояние
остается неизменным, например, через 500 мс.
В целом устройство является работоспособным, а основная задача дан-
ной главы — знакомство со средой разработки AVR Studio, а также техни-
кой разработки и отладки.
Перед окончательным ассемблированием восстановим программу, уда-
лив команду re?, введенную нами в самое начало подпрограммы JJOOra^;.
Ассемблируйте программу, нажав F7. Теперь в файле
c:\avr\Alarm\Alarm.hex находится исполняемый код нашей программы.
Именно с этим файлом будет работать компьютерная программа, обслу-
живающая ваш программатор.
Теперь вы можете подключить программатор к разъему ХР1 платы кон-
троллера сигнализации, подсоединить программатор к соответствующему
разъему компьютера, подать питание на плату контроллера, запустить
компьютерную программу, обслуживающую ваш программатор, выполг
нить стирание Flash-памяти микроконтроллера, а затем записать туда ис-
полняемый код нашей программы.
Надеюсь, что программирование прошло удачно.
-47


Глава 2. Первый проект: контроллер сигнализации
2.2.2. Программа для контроллера сигаализации с использованием
прерываний

i
Ввод программы |
Создадим новый проект Almint в новой папке c:\avr\Alm_Int, откроем
новый файл программы Alm_lnt.asm. О том, как это делается, смотрите в
подразделе «Создание проекта».
Файл программы пуст, облегчим себе задачу, скопировав содержимое
файла первого варианта программы Alarm.asm, для этого откроем меню
File/Open File, в появившемся окне «Открыть» разыш:ем и откроем файл
c:\avr\Alarm\Alarm.asm. Появившееся на экране окно с нашей прежней
программой скрывает под собой окно нашей новой программы. Верхнее
окно можно переместить в сторону.
Установите курсор в окне со старой программой, откройте контекстное
меню для этого окна, щелкнув правой клавишей мышки, выберите строку
Select all, скопируйте выделенный текст программы.
Для копирования можно выбрать один из вариантов:
• установить указатель мышки на выделенном фрагменте, нажать пра-
вую клавишу мышки и в открывшемся окне выбрать строку Сору;
• воспользоваться клавиатурой, нажав Ctrl + С;
• вызвать меню Edit/Copy;
• установить указатель мышки на выделенном фрагменте, нажав и
удерживая клавишу Ctrl и левую клавишу мышки, переместить
мышкой выделенный фрагмент в окно новой программы.


С^


При
наборе
програм
м
попробу
йте все
способы
работы с
фрагмен
тами
текста,
знаком
ые вам
по
опыту
общени
я с
Window
s 9х и
Microso
ft
Office.


Установите указатель мышки в окно новой программы Alm_Int.asm и
вставьте скопированный текст (снова есть множество вариантов, я пользу-
юсь правой кнопкой мыши, в открывшемся контекстном меню выбираю
Past/Вставить).
Окно старой программы Alarm.asm закрываем, оно больше не понадобится.


С^


Если
при
загрузке
исполня
емого
кода
програм
мы в
микроко
нтрол-
лер вы
не
можете
обнаруж
ить файл
hex,
измените
формат
файла в
меню
Project/A
VR
Assembl
er
Setup/Ad
ditional
Output
file
format на
формат
Intel
Intellec
8/MDS
(Intel
Hex) и
снова
ассембл
ируйте
програм
му


Ниже приведен листинг измененной программы. Сравните ее с преды-
дущей программой и внесите соответствующие коррективы.
-48-
 
Сайт управляется системой uCoz